import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import { getToken, saveToken } from './token'
import { Toast } from 'vant'
import router from '@/router/index'

Vue.use(VueAxios, axios)
Vue.use(Toast)

// 登录接口
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 10000
})

// 添加请求拦截 自动添加token
instance.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers.Authorization = `Bearer ${getToken().token}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)

// 添加响应拦截 拦截token过期的401错误
instance.interceptors.response.use(
  // 对响应数据操作
  response => {
    // console.log(response)
    return response
  },
  // 对响应错误操作
  async error => {
    // 判断错误码是不是401
    if (error.response.status === 401) {
      // 是401,判断用户没有token
      if (getToken()) {
        // 有token,说明token过期，需要请求刷新token
        /* 使用try-catch捕捉异常 */
        try {
          //刷新token
          const res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${getToken().refresh_token}`
            }
          })
          // 成功：更新token,返回当前页
          console.log('更新了token:' + res)
          let newToken = getToken()
          newToken.token = res.data.data.token
          saveToken(newToken)
          // 返回当前配置信息
          return instance(error.config)
        } catch (err) {
          // 失败：说明refresh过期，需要重新登录
          //弹窗提示
          Toast.fail('请重新登录')
          //跳转登录页
          router.push('/login')
        }
      } else {
        // 没有token，说明用户未登录，需要重新登录
        //弹窗提示
        Toast.fail('请重新登录')
        //跳转登录页
        router.push('/login')
      }
    }
    // 不是401，说明是其他问题，例如404路径错误，这个不做处理
    return Promise.reject(error)
  }
)

export default instance
